/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKCotizacion;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetalleCotizacion;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioUnidadMedidaComp;
import pe.com.cotelasa.scp.entidad.DetalleCotizacion;
import pe.com.cotelasa.scp.entidad.TipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.UnidadMedidaComp;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBDetalleCotizacion")
@Scope("request")
public class MBDetalleCotizacion extends MBGenerico implements Serializable {

    @Inject
    private BKDetalleCotizacion bkDetalleCotizacion;
    @Inject
    private BKCotizacion bkCotizacion;
    @Inject
    private MBCotizacion mbCotizacion;
    @Inject
    private IServicioServicio servicioServicio;
    @Inject
    private IServicioUnidadMedidaComp servicioUnidadMedidaComp;
    @Autowired
    BKSession session;

    public void eliminarDetalleCotizacionArticulo(ActionEvent actionEvent) {
        DetalleCotizacion detalleEliminado = this.bkDetalleCotizacion.getCurrentDetalleCotizacion();
        if (detalleEliminado.getId() == null) {

            Iterator itr = this.bkDetalleCotizacion.getListaDetalleCotizacionArticulo().iterator();
            while (itr.hasNext()) {
                DetalleCotizacion deta = (DetalleCotizacion) itr.next();
                if (detalleEliminado.getNombreDetalle().equals(deta.getNombreDetalle())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = this.bkDetalleCotizacion.getListaDetalleCotizacionArticulo().indexOf(detalleEliminado);

            this.bkDetalleCotizacion.getListaDetalleCotizacionArticulo().remove(detalleEliminado);
            detalleEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            detalleEliminado.setFecModificacion(new Date());
            detalleEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().set(index, detalleEliminado);
        }
        this.bkDetalleCotizacion.setSumaDetalleArticulo(sumarPrecio(this.bkDetalleCotizacion.getListaDetalleCotizacionArticulo()));
        sumarArticulosYServicios();

    }

    public void eliminarDetalleCotizacionServicio(ActionEvent actionEvent) {
        DetalleCotizacion detalleEliminado = this.bkDetalleCotizacion.getCurrentDetalleCotizacion();
        if (detalleEliminado.getId() == null) {

            Iterator itr = this.bkDetalleCotizacion.getListaDetalleCotizacionServicio().iterator();
            while (itr.hasNext()) {
                DetalleCotizacion deta = (DetalleCotizacion) itr.next();
                if (detalleEliminado.getNombreDetalle().equals(deta.getNombreDetalle())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = this.bkDetalleCotizacion.getListaDetalleCotizacionServicio().indexOf(detalleEliminado);

            this.bkDetalleCotizacion.getListaDetalleCotizacionServicio().remove(detalleEliminado);
            detalleEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            detalleEliminado.setFecModificacion(new Date());
            detalleEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar().set(index, detalleEliminado);
        }
        this.bkDetalleCotizacion.setSumaDetalleServicio(sumarPrecio(this.bkDetalleCotizacion.getListaDetalleCotizacionServicio()));
        sumarArticulosYServicios();


    }

    public void agregarDetalleCotizacionServicio(ActionEvent actionEvent) {
        DetalleCotizacion detalleAgregado = this.bkDetalleCotizacion.getFormularioDetalleCotizacion();
        detalleAgregado.setUsrCreacion(session.getUsuario().getUsuario());
        detalleAgregado.setFecCreacion(new Date());
        detalleAgregado.setTipoDetalle('S');
        detalleAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());

        this.bkDetalleCotizacion.setFormularioDetalleCotizacion(new DetalleCotizacion());
        this.bkDetalleCotizacion.getListaDetalleCotizacionServicio().add(detalleAgregado);
        this.bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar().add(detalleAgregado);
        this.bkDetalleCotizacion.setSumaDetalleServicio(sumarPrecio(this.bkDetalleCotizacion.getListaDetalleCotizacionServicio()));
        sumarArticulosYServicios();
    }

    public void editarDetalleCotizacionArticulo(RowEditEvent event) {
        DetalleCotizacion detalleEditado = (DetalleCotizacion) event.getObject();
        Integer index = this.bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().indexOf(detalleEditado);
        if (detalleEditado.getCosto().doubleValue() > 0) {
            BigDecimal costoSoles = bkCotizacion.getCotizacionFormulario().getCambioCompra().multiply(detalleEditado.getCosto());
            detalleEditado.setCostoSoles(costoSoles);
        } else if (detalleEditado.getCostoSoles().doubleValue() > 0) {
            BigDecimal costoDolares = detalleEditado.getCostoSoles().divide(bkCotizacion.getCotizacionFormulario().getCambioCompra(), MathContext.DECIMAL32);
            detalleEditado.setCosto(costoDolares);
        }
        detalleEditado.setCantidadCompra(this.bkDetalleCotizacion.getCantidadCompra());
        detalleEditado.setUnidadMedidaCompra(this.bkDetalleCotizacion.getUnidadMedidaCompra());


        detalleEditado.setPrecio((detalleEditado.getComposicion().divide(detalleEditado.getCantidadCompra(), MathContext.DECIMAL32)).multiply(detalleEditado.getCosto(), MathContext.DECIMAL32));

        if (detalleEditado.getId() != null) {
            detalleEditado.setUsrModificacion(session.getUsuario().getUsuario());
            detalleEditado.setFecModificacion(new Date());
        }
        this.bkDetalleCotizacion.setCantidadCompra(BigDecimal.ZERO);
        this.bkDetalleCotizacion.setUnidadMedidaCompra("");
        this.bkDetalleCotizacion.getListaDetalleCotizacionArticuloEditar().set(index, detalleEditado);
        this.bkDetalleCotizacion.setSumaDetalleArticulo(sumarPrecio(this.bkDetalleCotizacion.getListaDetalleCotizacionArticulo()));
        sumarArticulosYServicios();
        System.out.println("editando");
    }

    public void editarDetalleCotizacionServicio(RowEditEvent event) {
        DetalleCotizacion detalleEditado = (DetalleCotizacion) event.getObject();
        Integer index = this.bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar().indexOf(detalleEditado);
        if (detalleEditado.getId() != null) {

            detalleEditado.setUsrModificacion(session.getUsuario().getUsuario());
            detalleEditado.setFecModificacion(new Date());
        }

        this.bkDetalleCotizacion.getListaDetalleCotizacionServicioEditar().set(index, detalleEditado);
        this.bkDetalleCotizacion.setSumaDetalleServicio(sumarPrecio(this.bkDetalleCotizacion.getListaDetalleCotizacionServicio()));
        sumarArticulosYServicios();
    }

    static BigDecimal sumarPrecio(List<DetalleCotizacion> listaDetalle) {
        System.out.println("entro a sumar:");
        BigDecimal suma = BigDecimal.ZERO;
        for (DetalleCotizacion detalle : listaDetalle) {
            if (detalle.getPrecio() != null) {
                suma = suma.add(detalle.getPrecio());
            }
        }

        System.out.println("suma: "+suma);
        return suma;
    }

    public void sumarArticulosYServicios() {
       
        mbCotizacion.calcularTotales();

    }

    public void nuevoDetalle() {
        this.bkDetalleCotizacion.setFormularioDetalleCotizacion(new DetalleCotizacion());
        this.bkDetalleCotizacion.setCantidadCompra(BigDecimal.ZERO);
        try {
            bkDetalleCotizacion.setListaServicio(servicioServicio.listarServiciosActivos());
        } catch (ServiceException e) {
            e.printStackTrace();
        }

    }

    public void cargarUnidadesMedida(DetalleCotizacion det) {
        //bkDetalleCotizacion.setListaUnidadMedidaComp(new ArrayList<UnidadMedidaComp>());
       /* if (this.bkDetalleCotizacion.isEstaEditando()) {
            this.bkDetalleCotizacion.setEstaEditando(false);
        } else {
            this.bkDetalleCotizacion.setEstaEditando(true);
        }*/
        System.out.println("preparando para editar");
        UnidadMedidaComp unidad = new UnidadMedidaComp();
        unidad.setIdTipoUnidadMinima(new TipoUnidadMinima());
        unidad.getIdTipoUnidadMinima().setAbrev(det.getUnidadMedida());
        try {
            bkDetalleCotizacion.setListaUnidadMedidaComp(servicioUnidadMedidaComp.listarUnidadMedidaCompPorFiltro(unidad));
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        if (this.bkDetalleCotizacion.getUnidadMedidaCompra() == null || this.bkDetalleCotizacion.getUnidadMedidaCompra().equals("") ) {
        //if (this.bkDetalleCotizacion.isEstaEditando()) {
            if (det.getUnidadMedidaCompra() == null || det.getUnidadMedidaCompra().equals("")) {
                this.bkDetalleCotizacion.setUnidadMedidaCompra("");
                this.bkDetalleCotizacion.setCantidadCompra(BigDecimal.ONE);
            } else {
                this.bkDetalleCotizacion.setUnidadMedidaCompra(det.getUnidadMedidaCompra());
                this.bkDetalleCotizacion.setCantidadCompra(det.getCantidadCompra());
            }
        }

        //}
        System.out.println("pa trabajar " + this.bkDetalleCotizacion.getUnidadMedidaCompra());

    }

    public void cargarCantidadUMC() {
        try {
            this.bkDetalleCotizacion.setCantidadCompra(servicioUnidadMedidaComp.conseguirUnidadMedidaCompPorvalCadena(this.bkDetalleCotizacion.getUnidadMedidaCompra()).getValNumerico());
            /*this.bkDetalleCotizacion.setCurrentDetalleCotizacion(new DetalleCotizacion());
             this.bkDetalleCotizacion.getCurrentDetalleCotizacion().setCantidadCompra(BigDecimal.ZERO);*/

        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }
}
